"""
Redis 通用 方法封装
"""

from db_base.redis_db import (
    REDIS_PREFIX,
    modify_name_prefix,
    name_add_prefix,
)
from db_base.redis_db.client import redis_client
from my_typing import *


class Basic:
    """ 通用 """

    @staticmethod
    def exists(*names: str) -> int:
        """
        判断 name 这个键是否存在

        Args:
            names: 键的名称（可以为多个）

        Returns:
            存在的键的数量
        """

        _names: ListStr = []

        for i in names:
            if isinstance(i, str):
                _names.append(name_add_prefix(i))

            elif isinstance(i, (list, tuple)):
                for _name in i:
                    _names.append(name_add_prefix(_name))

        if not _names:
            return 0

        return redis_client.exists(*_names)

    @staticmethod
    @modify_name_prefix
    def ttl(name: str) -> int:
        """
        查看 name 这个键的有效时间（秒）

        Args:
            name: 键的名称

        Returns:
            有效时间（秒）
        """

        return redis_client.ttl(name)

    @staticmethod
    @modify_name_prefix
    def expire(
        name: str,
        time_: timedelta | int,
    ) -> bool:
        """
        设置 name 这个键的有效时间（秒）

        Args:
            name: 键的名称
            time_: 有效时间（秒）

        Returns:
            True / False
        """

        return redis_client.expire(name, time_)

    @staticmethod
    def keys() -> ListStr:
        """
        获取所有键

        Returns:
            键列表（仅返回当前系统的）
        """

        return [
            name
            for name in redis_client.keys()
            if name.startswith(REDIS_PREFIX)
        ]

    @staticmethod
    def rename(
        name: str,
        new_name: str,
    ) -> None:
        """
        重命名键

        Args:
            name: 键的名称
            new_name: 新键的名称

        Returns:
            True / False
        """

        return redis_client.rename(
            src=name_add_prefix(name),
            dst=name_add_prefix(new_name),
        )

    @staticmethod
    def delete(*names: str) -> int:
        """
        删除指定键（可以为多个）

        Args:
            names: 键的名称（可以为多个）

        Returns:
            删除键的数量
        """

        if not names:
            raise ValueError("请传入需要删除的 Key")

        _names: ListStr = []

        for i in names:
            if isinstance(i, str):
                _names.append(name_add_prefix(i))

            elif isinstance(i, (list, tuple)):
                for _name in i:
                    _names.append(name_add_prefix(_name))

        return redis_client.delete(*_names)

    @staticmethod
    def delete_all() -> int:
        """
        删除所有键（仅删除当前系统的）

        Returns:
            删除键的数量
        """

        return redis_client.delete(*Basic.keys())
